package lt201
/*
算法计划  位运算 简单

201. 数字范围按位与
给你两个整数 left 和 right ，表示区间 [left, right] ，
返回此区间内所有数字 按位与 的结果（包含 left 、right 端点）。

 
最直观的解决方案就是迭代范围内的每个数字，依次执行按位与运算，得到最终的结果，
但此方法在 [m,n][m,n] 范围较大的测试用例中会因超出时间限制而无法通过，因此我们需要另寻他路。

我们可以发现，对所有数字执行按位与运算的结果是所有对应二进制字符串的公共前缀再用零补上后面的剩余位。

最终我们可以将问题重新表述为：给定两个整数，我们要找到它们对应的二进制字符串的公共前缀。

将两个数字不断向右移动，直到数字相等，即数字被缩减为它们的公共前缀。
然后，通过将公共前缀向左移动，将零添加到公共前缀的右边以获得最终结果。
*/
func rangeBitwiseAnd(left int, right int) int {
	shift := 0
	for left < right {
		left,right = left>>1, right>>1
		shift ++
	}   //left == right 跳出
	return left << shift
}